1
เกินกว่าบทความ
AI008บทเรียนที่ 2
00:07

การสร้างสะพานข้ามช่องว่างระหว่างการอ่านงานวิจัยอย่างผู้ชมที่ไม่ได้มีส่วนร่วม กับการบรรลุความเชี่ยวชาญด้านวิศวกรรมนั้น จำเป็นต้องเจาะลึกเข้าไปในหัวใจทางคณิตศาสตร์ของโมเดลแปลง (Transformer) โดยการเปลี่ยนจากการเข้าใจเชิงทฤษฎีมาสู่การประยุกต์ใช้งานจริง เป็นเพียงวิธีเดียวในการถอดรหัสความซับซ้อนที่ซ่อนอยู่ในพื้นที่ลักษณะแบบมิติสูง

1. หลักเหตุผลทางคณิตศาสตร์ของการปรับขนาด

กลไกหลักของโมเดลภาษาสมัยใหม่คือการจัดลำดับความสำคัญโดยการคูณจุดที่ปรับขนาดแล้ว. รายละเอียดด้านวิศวกรรมที่สำคัญซึ่งมักถูกมองข้ามในทฤษฎีคือกฎการปรับขนาด:

  • คะแนนความสนใจดิบต้องหารด้วยรากที่สองของขนาดมิติของคีย์ (dk).
  • ทำไม?ซึ่งป้องกันไม่ให้ผลคูณจุดใหญ่เกินไป ซึ่งจะทำให้ฟังก์ชันโซฟต์แม็กซ์เข้าสู่พื้นที่ที่มีเกรเดียนต์ที่เล็กมากซึ่งทำให้ความสามารถของโมเดลในการเรียนรู้ในระหว่างกระบวนการถ่ายโอนย้อนกลับแทบจะหมดไป

2. จากทฤษฎีสู่การดำเนินการด้วยเทนเซอร์

การเข้าใจเชิงวิศวกรรมเกี่ยวข้องกับการเปลี่ยนจากวงจรแนวคิดไปสู่การคูณเมทริกซ์แบบขนานที่มีประสิทธิภาพสูง.

  • การใส่ข้อมูลลำดับ:แตกต่างจากโมเดลแบบ RNN ที่มีลำดับโดยธรรมชาติ แต่โมเดลแปลงไม่มีความเข้าใจในลำดับ วิศวกรต้องเขียนโค้ดฟังก์ชันไซน์และโคไซน์เอง (การเข้ารหัสตำแหน่ง) เพื่อใส่ข้อมูลลำดับ
  • กลไกความมั่นคง:การประยุกต์ใช้งานต้องอาศัยการใช้อย่างมีกลยุทธ์การเชื่อมต่อแบบคงที่ และการปกติแบบเลเยอร์ (LayerNorm)เพื่อต่อต้านการเปลี่ยนแปลงของตัวแปรภายในและรับประกันว่ากระบวนการฝึกอบรมจะคงความมั่นคง
ข้อคิดเชิงวิศวกรรม
ความเชี่ยวชาญแท้จริงเกิดขึ้นจากการเขียนโปรแกรมทีละบรรทัด ถ้าพึ่งพาเอกสารทางวิชาการเพียงอย่างเดียว มักนำไปสู่ความเข้าใจผิดเกี่ยวกับเสถียรภาพของเกรเดียนต์และความสามารถในการคำนวณ
การนำเสนองานด้วยภาษาไพธอน (PyTorch)
1
นำเข้า torch
2
นำเข้า torch.nn เป็น nn
3
นำเข้า math
4
5
ฟังก์ชัน_scaled_dot_product_attention(query, key, value):
6
# คำนวณ d_k (มิติของคีย์)
7
d_k = query.size(-1)
8
9
# คำนวณคะแนนความสนใจดิบ
10
# เปลี่ยนจากลูปที่ง่ายๆ มาเป็นการคูณเมทริกซ์
11
คะแนน = torch.matmul(query, key.transpose(-2, -1))
12
13
# ใช้กฎการปรับขนาดเพื่อป้องกันเกรเดียนต์ที่เล็กมาก
14
scaled_scores = คะแนน / math.sqrt(d_k)
15
16
# ใช้ฟังก์ชันโซฟต์แม็กซ์เพื่อหาค่าน้ำหนักความสำคัญ
17
attention_weights = torch.softmax(scaled_scores, dim=-1)
18
19
# ผลลัพธ์คือผลรวมน้ำหนักของค่าต่างๆ
20
คืนค่า torch.matmul(attention_weights, value)